<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script>
			/*
			 * 函数 fuction
			 * 		函数也是一个对象
			 * 		函数中可以封装一些功能(代码), 在 需要时可以执行这些功能(代码)
			 * 		函数中可以保存一些代码在需要的时候调用
			 * 		使用typeof检查一个函数对象时, 会返回funcion
			 */
			
			// 创建一个函数对象
			//var fun = new Function("console.log('hello 这是您想要的函数')");
			
			// 封装到函数中的代码不会立即执行
			// 函数中的代码会在函数调用的时候执行
			// 调用函数语法, 函数对象()
			//fun();
			
			
			
			/*
			 * 使用函数声明来创建一个函数
			 */
			function fun2(){
				console.log('hello 这是您想要的函数');
				document.write("~(>_<)~");
			}
			
			fun2();
			
			//fun3();   // fun3 is not a funciton
			
			/*
			 * 使用函数表达式来创建一个函数
			 */
			var fun3 = function(){
				console.log('hello 这是您想要的函数');	
			}
			fun3();
			
			
			// 带参函数
			function sum(a, b){
				console.log(a + b);
			}
			
			/*
			 * 在调用函数时, 可以在()中指定实参
			 * 函数的实参可以是任意类型
			 * 调用函数时解析器不会检查实参的类型和数量
			 * 多余的形参不会被赋值
			 * 如果实参的数量少于形参的数量, 则没有对应实参的形参将是undefined
			 */
			sum();
			sum(1, 2);
			sum(123, "hello");
			sum(true, false);
			sum(123, 456, true, null);
			
			/*
			 * 实参可以是一个对象, 也可以是一个函数
			 */
			var obj = {
				name: "zhaoliying",
				job: "actor"
			}
			function fun6(a){
				console.log("a = "+a);
			}
			fun6(obj);
			fun6(fun3);
			
			/*
			 * 函数返回值
			 * 如果return语句后不跟任何值就相当于返回一个undefined
			 * 如果函数中不谢return, 则也返回undefined
			 */
			function fun5(a, b, c){
				return a + b + c;
			}
			
			var result = fun5(12, 34, 56);
			alert(result);
			
			/*
			 * 函数的返回值可以使任意类型
			 */
			function fun7(){
				function fun8(){
					alert(fun8);
				}
				return fun8;
			}
			console.log(fun7());
			fun7()();
			
		</script>
	</head>
	<body>
	</body>
</html>
